import time
import warnings
from pywinauto import Application
from pywinauto.timings import TimeoutError
from pywinauto.keyboard import send_keys

# 忽略pywinauto的警告
warnings.filterwarnings("ignore", category=UserWarning, module="pywinauto")

def handle_file_dialog_by_handle(file_path, dialog_handle=None):
    """
    通过窗口句柄操作文件选择对话框（更精确的方法）

    Args:
        file_path (str): 要上传文件的完整绝对路径
        dialog_handle: 可选的窗口句柄，如果为None则自动查找
    """
    try:
        app = Application(backend="win32")

        # 如果没有传入句柄，则自动查找文件对话框
        if dialog_handle is None:
            app.connect(title_re=".*打开.*")  # 使用正则匹配窗口标题
        else:
            # 连接到指定句柄的窗口
            app.connect(handle=dialog_handle)

        dialog = app.window(title_re=".*打开.*")  # 使用正则确保匹配文件选择对话框

        # 等待文件对话框可见并响应
        dialog.wait('visible', timeout=5)

        # 输入文件路径到文件选择框
        edit_control = dialog.child_window(class_name="Edit")
        edit_control.wait('ready', timeout=3)
        edit_control.set_text(file_path)
        time.sleep(1)
        # 使用正则匹配按钮标题忽略快捷键
        # open_button = dialog.child_window(title_re="打开", class_name="Button")
        # open_button.wait('enabled', timeout=3)  # 等待按钮可点击
        # open_button.click()
        
        send_keys("{ENTER}")
        
        print("通过句柄操作完成！")
        return True

    except TimeoutError as te:
        print(f"操作超时：{te}")
        return False
    except Exception as e:
        print(f"句柄操作失败: {e}")
        return False
